package com.cp.admin.modular.system.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.cp.admin.api.entity.Result;
import com.cp.admin.core.util.EthUtil;
import com.cp.admin.core.util.HttpClientUtils;
import com.cp.admin.modular.system.model.EthKey;
import com.cp.admin.modular.system.model.EthToken;
import com.cp.admin.modular.system.dao.EthTokenMapper;
import com.cp.admin.modular.system.service.IEthKeyService;
import com.cp.admin.modular.system.service.IEthTokenService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 系统支持的ETH公链币种 服务实现类
 * </p>
 *
 * @author yy123
 * @since 2020-03-12
 */
@Service
public class EthTokenServiceImpl extends ServiceImpl<EthTokenMapper, EthToken> implements IEthTokenService {
    private static String ethUrl = "https://api.etherscan.io/api";


    @Autowired
    private IEthKeyService ethKeyService;
    @Autowired
    private IEthTokenService ethTokenService;

    @Autowired
    private static EthUtil ethUtil;

    public void recharge() {
        //主网
//        Wrapper wrapper = new EntityWrapper();
//        wrapper.eq("type", 1);
//        wrapper.eq("status", 0);
//        EthToken token = this.selectOne(wrapper);
//        wrapper = new EntityWrapper();
//        wrapper.eq("token_id",token.getId());
//        wrapper.eq("status",0);
//        //该代币的用户列表
//        wrapper = new EntityWrapper();
//        wrapper.eq("token_id",token.getId());
//        wrapper.eq("status",0);
//        List<UserAsstes> wallets = userAsstesService.selectList(wrapper);
//        for(UserAsstes Wallet : wallets) {
//            UserEthAddress ethAddress = userEthAddressService.selectById(Wallet.getUserId());
//            if (ethAddress == null) {
//                System.out.println("该用户没有该钱包地址");
//                return;
//            }
//            String ethaddress = ethAddress.getAddress();
//            Map<String, String> map1 = new HashMap();
//            map1.put("module", "account");
//            map1.put("action", "txlist");
//            //map.put("contractaddress",payToken.getContract());
//            map1.put("address", ethaddress);
//            map1.put("startblock", "0");
//            map1.put("endblock", "999999999999999");
//            map1.put("page", "1");
//            map1.put("offset", "5");
//            map1.put("sort", "DESC");
//            map1.put("apikey", "YZEMEFGZEWKMAJXMNGB1G9IWZAZNP2T1CF");
//            try {
//                String re = HttpClientUtils.postParameters(ethUrl, map1);
//                JSONObject jsonObject = JSON.parseObject(re);
//                if (jsonObject.getInteger("status") == 1) {
//                    JSONArray array = jsonObject.getJSONArray("result");
//                    for (int i = 0; i < array.size(); i++) {
//                        JSONObject tx = array.getJSONObject(i);
//                        String hash = tx.getString("hash");
//                        String to = tx.getString("to");
//                        String from = tx.getString("from");
//                        Long confirmations = tx.getLong("confirmations");
//                        BigDecimal value = tx.getBigDecimal("value");
//                        //int tokenDecimal = tx.getIntValue("tokenDecimal");
//                        //in 进入待入账状态
//                        if (to.equals(ethaddress) && value.compareTo(BigDecimal.ZERO) == 1) {
//                            //排除重复入账
//                            wrapper = new EntityWrapper();
//                            wrapper.eq("txid", hash);
//                            int count = this.baseMapper.selectCount(wrapper);
//                            if (count > 0) {
//                                continue;
//                            }
//                            BigDecimal amount = value.divide(BigDecimal.TEN.pow(18));
//                            //业务处理 写入待充值订单
//                            UserRecharge recharge = new UserRecharge();
//                            recharge.setUserId(Wallet.getUserId());
//                            recharge.setQuantity(amount);
//                            recharge.setTokenId(Wallet.getTokenId());
//                            recharge.setTokenName(token.getTokenName());
//                            recharge.setType(0);
//                            recharge.setAddress(from);
//                            recharge.setAffirmNum(confirmations.intValue());
//                            //recharge.setMinersFee();
//                            recharge.setStatus(2);
//                            recharge.setCreateTime(new Date());
//                            recharge.setUpdateTime(new Date());
//                            userRechargeService.insert(recharge);
//                        }
//                    }
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//
//        //erc20
//        wrapper = new EntityWrapper();
//        wrapper.eq("type",1);
//        wrapper.eq("status",0);
//        //查询支持的erc20代币
//        List<EthToken> tokens = this.selectList(wrapper);
//        for (EthToken payToken : tokens){
//            //该代币的用户列表
//            wrapper = new EntityWrapper();
//            wrapper.eq("token_id",payToken.getId());
//            wrapper.eq("status",0);
//            List<UserAsstes> payWallets = userAsstesService.selectList(wrapper);
//
//            for(UserAsstes payWallet : payWallets){
//                UserEthAddress userEthAddress = userEthAddressService.selectById(payWallet.getUserId());
//                if(userEthAddress == null){
//                    System.out.println("该用户没有该钱包地址");
//                    continue;
//                }
//                String address = userEthAddress.getAddress();
//                Map<String, String> map = new HashMap();
//                map.put("module","account");
//                map.put("action","tokentx");
//                map.put("contractaddress",payToken.getContract());
//                map.put("address",address);
//                map.put("page","1");
//                map.put("offset","5");
//                map.put("sort","DESC");
//                map.put("apikey","YZEMEFGZEWKMAJXMNGB1G9IWZAZNP2T1CF");
//                try {
//                    String re = HttpClientUtils.postParameters(ethUrl, map);
//                    JSONObject jsonObject = JSON.parseObject(re);
//                    if (jsonObject.getInteger("status") == 1) {
//                        JSONArray array = jsonObject.getJSONArray("result");
//                        for (int i = 0; i < array.size(); i++) {
//                            JSONObject tx = array.getJSONObject(i);
//                            String hash = tx.getString("hash");
//                            String to = tx.getString("to");
//                            String from = tx.getString("from");
//                            Long confirmations = tx.getLong("confirmations");
//                            BigDecimal value = tx.getBigDecimal("value");
//                            int tokenDecimal = tx.getIntValue("tokenDecimal");
//                            //in 进入待入账状态
//                            if (to.equals(address)) {
//                                //排除重复入账
//                                wrapper = new EntityWrapper();
//                                wrapper.eq("txid",hash);
//                                int count = this.baseMapper.selectCount(wrapper);
//                                if(count>0){
//                                    continue;
//                                }
//                                BigDecimal amount = value.divide(BigDecimal.TEN.pow(tokenDecimal));
//                                //业务处理 写入待充值订单
//                                UserRecharge recharge = new UserRecharge();
//                                recharge.setUserId(payWallet.getUserId());
//                                recharge.setQuantity(amount);
//                                recharge.setTokenId(payWallet.getTokenId());
//                                recharge.setTokenName(payToken.getTokenName());
//                                recharge.setType(0);
//                                recharge.setAddress(from);
//                                recharge.setAffirmNum(confirmations.intValue());
//                                //recharge.setMinersFee();
//                                recharge.setStatus(2);
//                                recharge.setCreateTime(new Date());
//                                recharge.setUpdateTime(new Date());
//                                userRechargeService.insert(recharge);
//                            }
//                        }
//                    }
//                }catch (Exception e){
//                    e.printStackTrace();
//                }
//            }
//        }
    }

    public void confirmations() {
//        Wrapper wrapper = new EntityWrapper();
//        wrapper.in("status","2");
//        wrapper.eq("type",0);
//        List<UserRecharge> list = userRechargeService.selectList(wrapper);
//        for(UserRecharge record :list){
//            Result result = ethUtil.getTxConfirmation(record.getTxId());
//            if(result.getCode() == 0){
//                BigInteger confirmation = new BigInteger(String.valueOf(result.getData()));
//                //大于5个确认
//                if(confirmation.intValue() >= 5){
//                    //入账
//                    wrapper = new EntityWrapper();
//                    wrapper.eq("user_id",record.getUserId());
//                    wrapper.eq("token_id",record.getTokenId());
//                    UserAsstes wallet = userAsstesService.selectOne(wrapper);
//                    if(wallet == null){
//                        System.out.println("获取用户钱包信息失败："+record.getUserId());
//                        continue;
//                    }
//                    BigDecimal value = record.getQuantity();
//                    BigDecimal tokenNumber = wallet.getTokenNumber();
//                    BigDecimal usableCoinNumber = wallet.getAvailableNumber();
//                    tokenNumber = tokenNumber.add(value);
//                    usableCoinNumber = usableCoinNumber.add(value);
//                    wallet.setTokenNumber(tokenNumber);
//                    wallet.setAvailableNumber(usableCoinNumber);
//                    if(userAsstesService.updateById(wallet)){
//                        record.setUpdateTime(new Date());
//                        record.setStatus(3);
//                        record.setAffirmNum(confirmation.intValue());
//                        userRechargeService.updateById(record);
//                    }
//                    //获取冷账户地址
//                    Wrapper wr = new EntityWrapper();
//                    wr.eq("status",0);
//                    wr.eq("type",1);
//                    EthKey le = ethKeyService.selectOne(wr);
//                    if(le == null){
//                        System.out.println("获取冷账户失败：recordId="+record.getId());
//                        continue;
//                    }
//                    //获取热账户
//                    wr = new EntityWrapper();
//                    wr.eq("status",0);
//                    wr.eq("type",0);
//                    EthKey re = ethKeyService.selectOne(wr);
//                    if(re == null){
//                        System.out.println("获取热账户失败：recordId="+record.getId());
//                        continue;
//                    }
//                    //获取token信息
//                    EthToken token = ethTokenService.selectById(record.getTokenId());
//                    if(token == null){
//                        System.out.println("获取token信息失败：recordId="+record.getId());
//                        continue;
//                    }
//                    //获取当前用户信息
//                    UserEthAddress key = userEthAddressService.selectById(record.getUserId());
//                    if(key == null) {
//                        System.out.println("获取当前用户信息失败：recordId="+record.getId());
//                        continue;
//                    }
//
//                    if(token.getType() == 0){
//                        Result pushTXRr = ethUtil.transfer(le.getAddress(),record.getQuantity().subtract(BigDecimal.valueOf(0.0001)),key.getPrivateKey());
//                        if(pushTXRr.getCode() == -1){
//                            System.out.println("发送代币失败：recordId:"+record.getId());
//                        }
//                        continue;
//                    }
//
//                    //将当前到账的代币转移至冷账户
//                    Result banlanceRe = ethUtil.getBalance(key.getAddress());
//                    if(banlanceRe.getCode() != -1){
//                        Long balance = Long.valueOf(banlanceRe.getData().toString());
//                        if(balance < 0.0001){
//                            Result tranRe = ethUtil.transfer(key.getAddress(),BigDecimal.valueOf(0.0001),re.getKey());
//                            if(tranRe.getCode() == -1){
//                                System.out.println("转手续费失败："+record.getId());
//                                continue;
//                            }
//                        }
//
//                       //发送erc20代币到冷账户
//                       Result pushTXRr = ethUtil.signEthTokenTransactionAndPush(key.getPrivateKey(),le.getAddress(),
//                               record.getQuantity(),token.getContract(),key.getCount(),token.getPrecision());
//                       if(pushTXRr.getCode() == -1) {
//                           System.out.println("发送代币失败：recordId:" + record.getId());
//                           continue;
//                       }
//                    }
//
//                }
//            }else {
//                System.out.println("获取区块高度失败："+record.getTxId());
//            }
//        }
    }
}
